#include <iostream>
using namespace std;

// class A
// {
// public:
//     A(int a = 1) : _a(a) 
//     {
//         cout << "A(int a = 1)" << endl;
//     }
//     int get_a()
//     {
//         return _a;
//     }
//     ~A()
//     {
//         cout << "~A()" << endl;
//     }
// private:
//     int _a;
// };

// int main()
// {
//     A a1;

//     A* p1 = (A*) operator new(sizeof(A));
//     new(p1)A(2);

//     cout << p1->get_a() << endl;

//     return 0;
// }

// int main()
// {
//     A* p1 = new A;
//     A* p2 = new A(5);
//     A* p3 = new A[3]{2,3,4};

//     cout << p1->get_a() << endl;
//     cout << p2->get_a() << endl;

//     for(int i = 0; i < 3; i++)
//     {
//         cout << p3[i].get_a() << endl;
//     }

//     delete p1;
//     delete p2;
//     delete[] p3;

//     // int *p1 = new int;
//     // int *p2 = new int(4);
//     // cout << *p1 << endl;
//     // cout << *p2 << endl;
//     // int *p3 = new int[10];
//     // int *p4 = new int[10]{1,2,3,4,5,6,7};
//     // for(int i = 0; i < 10; i++)
//     // {
//     //     cout << p3[i] << " ";
//     // }
//     // cout << endl;
//     // for(int i = 0; i < 10; i++)
//     // {
//     //     cout << p4[i] << " ";
//     // }
//     // cout << endl;
//     // delete p1;
//     // delete p2;
//     // delete[] p3;
//     // delete[] p4;


//     return 0;
// }

template <typename T>
void my_Swap(T* a,T* b)
{
    T temp = *a;
    *a = *b;
    *b = temp;
}

// template <class T>
// class A
// {
// public:
//     A(T a = T()) : _a(a)
//     {

//     }
//     T get_a()
//     {
//         return _a;
//     }
// private:
//     T _a;
// };


template <class T>
class A
{
public:
    A(T a = T());
    T get_a();
private:
    T _a;
};

template <class T>
A<T>::A(T a) : _a(a)
{

}

template <class T>
T A<T>::get_a()
{
    return _a;
}

int main()
{
    A<int> a;
    cout << a.get_a() << endl;

    A<char>* p1 = new A<char>('w');
    cout << p1->get_a() << endl;

    // int a = 5;
    // int b = 3;
    // cout << a << " " << b << endl;
    // my_Swap(&a,&b);
    // cout << a << " " << b << endl;
    // char c1 = 'w';
    // char c2 = 'z';
    // cout << c1 << " " << c2 << endl;
    // my_Swap(&c1,&c2);
    // cout << c1 << " " << c2 << endl;
    return 0;
}



